# 正则表达式
# 我们判断一个字符串是否是合法的Email的方法
# 1、创建一个匹配Email的正则表达式;
# 2、用正则表达式去匹配用户的输入来判断是否合法。
# \d 可以匹配一个数字 \w可以匹配一个字母或数字
# '00\d'可以匹配'007', 但无法匹配'00A'
# '\d\d\d'---'010'
# '\w\w\d'---'py3'
# . 可以匹配任意字符，所以：------'py.'---'pyc' 'py!'
# 要匹配变长的字符，在正则表达式中，用*表示任意个字符（包括0个），用+表示至少一个字符，用?表示0个或1个字符，用{n}表示n个字符，用{n,m}表示n-m个字符：
# '\d{3}'---'010'
#  \s 可以匹配一个空格  \s+ 表示至少有一个空格 ’‘  ’    ‘
# \d{3,8} 表示3-8个数字，例如’1234567‘
# 匹配 ’010-12345‘ ---'\d{3}\-\d{3-8}'  但是'010 - 12345'带空格的就需要更复杂的
# [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线；  [0-9a-zA-Z]
# [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串，比如'a100'，'0_Z'，'Py3000'等等；
# [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头，后接任意个由一个数字、字母或者下划线组成的字符串，也就是Python合法的变量；
# [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符（前面1个字符+后面最多19个字符）
# A|B可以匹配A或B，所以(P|p)ython可以匹配'Python'或者'python'。
# ^表示行的开头，^\d表示必须以数字开头。
# $表示行的结束，\d$表示必须以数字结束。
import re
s = r'ABC\-001' # Python的字符串
# match()方法判断是否匹配，如果匹配成功，返回一个Match对象，否则返回None。
a = re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
print(a)
# 用正则表达式切分字符串比用固定的字符更灵活，请看正常的切分代码：
print('a b   c'.split(' '))
# ['a', 'b', '', '', 'c']
# 嗯，无法识别连续的空格

b = re.split(r'\s+', 'a b  c')
# ['a', 'b', 'c']
print(b)
#无论多少个空格都可以正常分割。加入,

c = re.split(r'[\s\,]+','a,b, c   d')
# ['a', 'b', 'c', 'd']
print(c)

d = re.split(r'[\s\,\;]+','a,b;; c   d')
# ['a', 'b', 'c', 'd']
print(d)

from tqdm import tqdm
for i in tqdm(range(10000)):
    pass
# () 定义组，用group就能提取出来
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(m)
print(m.group(0))
print(m.group(1))
print(m.group(2))

# 贪婪模式
n = re.match(r'^(\d+?)(0*)$', '102300000').groups()
print(n)


